#include <stdio.h>
#include <stdlib.h>
#include <string.h> 

// 库函数 
//int main() {
//	char arr1[20] = {0};
//	char arr2[] = {"hello,fit"}; 
//	
//	strcpy(arr1,arr2);
//	printf("%s",arr1); 
//	
//	char arr[20] = "hello,world";
//	memset(arr,'x',5); 
//	printf("%s\n",arr); 
//	
//	
//	return 0;
//}
// 库函数的使用必须要包含相应的头文件,否则会警告 



// 自定义函数 
//void get_Max(int a,int b){
//	a>b?printf("%d",a):printf("%d",b); 
//} 
//
//int main(){
//	int a = 0;
//	int b = 0;
//	// 求较大值
//	scanf("%d %d",&a,&b); 
//	get_Max(a,b);
//	return 0; 
//} 


// 写一个函数可以交换两个整形变量的内容
//void swap(int a,int b,int c){
//	c = a;
//	a = b;
//	b = c; 
//} 

// 当实参传递给形参的时候,形参是实参拷贝的一份临时拷贝
// 对形参的修改不会影响实参 

//void swap1(int *px,int *py){
//	int z = *px; // a 
//	*px = *py; // a = b 
//	*py = z; // b = a 
//}
//
//int Add(int x,int y){
//	int z = 0;
//	z = x + y;
//	return z; 
//} 
//
//int main(){
//
//	int a = 0;
//	int b = 0;
//	scanf("%d %d",&a,&b); 
//	// 传值调用 
//	int c = Add(a,b);
//	printf("%d\n",c); 
//	
//
//	printf("交换前:%d %d\n",a,b);
//	// 传址调用：内部与外部真正建立联系 
//	swap(&a,&b); 
//	printf("交换后:%d %d\n",a,b);
//	return 0; 
//} 



// 一个工程中只能有一个main函数 

// 函数的参数
// 实参：真实传给函数的参数 ，可以是：常量、变量、表达式、函数等。 
// 形参：形式参数是指函数名后括号中的变量，因为形式参数只有在函数被调用中才实例化（分配内存单），函数调用完自动销毁。



// 嵌套调用 

//int Add(int x,int y){
//	
//	return x+y; 
//}
//
//int Sub(int x,int y){
//	
//	return x-y;
//} 
//
//int main(){
//	
//	return 0; 
//} 


// 链式访问
//#include <string.h> 
//
//int main(){
//	int len = strlen("abcdef");
//	printf("%d\n",len);
//
//	// 链式访问案列 
//	printf("%d",strlen("abcdef"));
//	
//	printf("%d",printf("%d",printf("%d",43))); // 4321,打印的是屏幕上返回字符的个数 
//	
//	int n = printf("\n12");
//	printf("\n%d",n) ;
//	
//	return 0;
//} 

// 函数不写返回返回值,默认返回int,但函数不推荐不写返回值前缀
// 返回viod类型非法 
// int函数需要明确返回类型,否则在一些函数中执行过程中最后一条指令执行的结果 
// 即使函数没有定义，也可以传参，但不推荐这么写

// 明确说明,main函数不需要参数
// 本质上main函数是有参数的
//int main(void){
//	
//} 

// main函数有3给参数
//int main(int argc,char *argv[],char *envp[]) {
//	
//}


// 函数的声明和定义 

//#include "add.h"
//#include "sub.h" 

// 导入静态库 
//#pragma comment(lib,"sub.a")
//
//int main(){
//	int a = 0;
//	int b = 0;
//	scanf("%d %d",&a,&b);
//	//加法
//	int sum = add(a,b);
//	printf("%d\n",sum);
//	
//	int ret = sub(a,b);
//	printf("%d\n",ret);
//	 
//	return 0; 
//} 



// 递归函数:一个函数直接或间接的自己调用自己(核心:大事化小)

// 接收一个整形值(无符号),按照顺序打印它的每一位
// 列如:
// 输入:1234,输出1 2 3 4 

// %d 是打印有符号的整数(会有正负数)
// %u 是打印无符号的整数 
 
//int main(){
//	unsigned int number = 0;
//	int n = 0;
//	unsigned int res = 0; 
//	int arr[20]; 
//	int count = 0;
//	int i = 0; 
//
//	scanf("%u",&number); 
//	while(number){
//		if(number != 0){
//			res = number % 10;
//			number /= 10;
//			arr[count] = res; 
//			count++; 	 
//		} 
//	} 
//	for(i=0;i<count;i++){
//		printf("%d ",arr[(count-1)-i]); 
//	} 
//
//	return 0; 
//} 

// 递归的实现
// 必要条件：需要限制，每次调用后接近这个限制
 
//void print(unsigned int n){ 
//	if(n>9){
//		print(n/10); 
//	} 
//	printf("%d ",n%10);  
//}
//// 打印4之间要执行print(123),打印3之前要执行print(12) ...
//
//int main(){
//	unsigned int num = 0;
//	scanf("%u",&num); // 1234
//	print(num); // 接收一个整形值(无符号),按照顺序打印它的每一位 
//	
//} 



// 编写函数，不允许创建临时变量，求字符串长度

//int my_strlen(char *str){  // 参数部分为指针形式 
//	
//	int count = 0; // 计数,临时变量 
//	while(*str != '\0'){
//		if(*str != '\0'){
//			count++;
//			str++; // 找到下一个字符 
//		} 		
//	} 
//	return count; 
//	
//}
// 

//递归求解
//int my_strlen(char *str){
//	if(*str != '\0'){
//		return 1 + my_strlen(str+1); // 用str++等于没动 
//	} 
//	else{
//		return 0; 
//	} 
//}
//
//int main(){
//	char arr[] = "abc"; // [ a b c \0]
//	int len = my_strlen(arr);
//	printf("%d\n",len); 
//	
//	return 0; 
//} 


// n！

//递归实现 
//int fac(int n){
//	int res = 0;
//	if(n<=1){
//		return 1; 
//	}
//	else{
//		return n * fac(n-1);
//	} 
//} 

// 迭代实现-非递归实现 
//int fac(int n){
//	int i = 0;
//	int res = 1; 
//	for(i=0;i<n;i++){
//		res *= i+1; 
//	}
//	return res; 
//} 
// 
//int main(){
//	int n = 0;
//	scanf("%d",&n);
//	int ret = fac(n);
//	printf("ret=%d",ret); 
//	return 0; 
//} 


// 求第n个斐波那契数列 
int fib_arr(int n){
	int arr[10000] = {1,1};
	int res = 0;
	int sum = 0; 
	int i = 0;
	if(n>2){
		for(i=2;i<n;i++){
		res = arr[i-2]+arr[i-1];
		arr[i] = res; 
	//	sum += res;
		}
	 
	}	
	else{
		return -1; 
	}	
	return res; 
} 

 
int main(){
	int n = 0;
	int ret = 0;
	scanf("%d",&n);
	ret = fib_arr(n);
	if(ret == -1){
		printf("输入错误!");
	} 
	else{
		printf("%d",ret);
	} 
	return 0; 
} 









